package edu.pe.cayetano.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import org.apache.commons.beanutils.DynaBean;

import ws.synopsis.frmwrk.common.BResult;
import edu.pe.cayetano.framework.Configuration;
import edu.pe.cayetano.framework.DAOException;
import edu.pe.cayetano.model.to.PacienteTO;
import edu.pe.cayetano.seccd.constantes.ConstantesSECCD;
import edu.pe.cayetano.util.Utilitario;
import edu.pe.cayetano.util.UtilitarioSQLQuery;

public class PacienteDAO extends BaseDAO{

	
	public PacienteDAO(Connection cnx) {
		super(cnx);
	}

	/**
	 * Metodo para buscar un paciente especifico por codigo de paciente
	 * @string codigo : codigo de paciente
	 * */
	public BResult buscarPacienteEspecifico(String codigo) throws Exception {

		PacienteTO 				pacienteTO	 	= null;
		PreparedStatement   	pstmt 		 	= null;
		ResultSet 				rs 			 	= null;
		BResult					ret				= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query = UtilitarioSQLQuery.devuelvePacienteEspecifico();
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,codigo);
			rs=pstmt.executeQuery();
			ret = new BResult();
			if(rs.next()){
				pacienteTO=new PacienteTO();
				pacienteTO.setPaciente_id(rs.getString(1));
				pacienteTO.setNombres(rs.getString(2));
				pacienteTO.setApepaterno(rs.getString(3));
				pacienteTO.setApematerno(rs.getString(4));
				pacienteTO.setDistrito(rs.getString(5));
				pacienteTO.setDni(rs.getString(6));
				pacienteTO.setFechanacimiento(rs.getString(7));
				pacienteTO.setTelefono_fijo(rs.getString(8));
				pacienteTO.setTelefono_celular(rs.getString(9));
				pacienteTO.setEstadocivil(rs.getString(10));
				pacienteTO.setSexo(rs.getString(11));
				pacienteTO.setDireccion(rs.getString(12));
				pacienteTO.setGradoInstruccion(rs.getString(13));
				pacienteTO.setEdad(rs.getInt(14));
				pacienteTO.setNombreCompleto(rs.getString(3)+" "+rs.getString(4)+", "+rs.getString(2));
				ret.setObject(pacienteTO);
				ret.setCode(ConstantesSECCD.EXITO_RET);;
			}else{
				pacienteTO=new PacienteTO();
				pacienteTO.setNombreCompleto("no");
				ret.setObject(pacienteTO);
				ret.setCode(ConstantesSECCD.EXITO_RET);;
			}
		}catch(Exception e){
			ret = new BResult();
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
			System.out.println("[SECCD][PacienteDAO][registraLoginFallido]:error en finally generado por:"+e.getMessage());
		}finally{
			try{
				pstmt.close();
				rs.close();
			}
			catch(Exception e){
				System.out.println("[SECCD][PacienteDAO][registraLoginFallido]:error en finally generado por:"+e.getMessage());
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	}
	
	/**
	 * Metodo para buscar un paciente especifico por historia clinica
	 * @string dni : DNI paciente
	 * */
	public BResult buscarPacientexHC(String dni) throws Exception {

		String 					schema			= Configuration.getSchemaDB();
		PacienteTO 			pacienteTO	 	= null;
		PreparedStatement   	pstmt 		 	= null;
		ResultSet 				rs 			 	= null;
		BResult					ret				= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query.append(" SELECT PACIENTE_ID,DNI,NOMBRE_COMPLETO,TIENE_HC"); 
			query.append(" FROM "+schema+"V_PACIENTE WHERE DNI=? AND TIENE_HC=?"); 
				pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,dni);
			pstmt.setString(2,"si");
			rs=pstmt.executeQuery();
			ret = new BResult();
			if(rs.next()){
				pacienteTO=new PacienteTO();
				pacienteTO.setPaciente_id(rs.getString(1));
				pacienteTO.setTieneHC("THC");
				ret.setObject(pacienteTO);
				ret.setCode(ConstantesSECCD.EXITO_RET);;
			}else{
				query  = new StringBuffer();
				query.append(" SELECT PACIENTE_ID,DNI,NOMBRE_COMPLETO"); 
				query.append(" FROM "+schema+"V_PACIENTE WHERE DNI=?"); 
					pstmt = getConnection().prepareStatement(query.toString());
				System.out.println("query:buscarPacientexHCxOS"+query.toString());
				pstmt.setString(1,dni);
				rs=pstmt.executeQuery();
				if(rs.next()){
					pacienteTO=new PacienteTO();
					pacienteTO.setPaciente_id(rs.getString(1));
					pacienteTO.setTieneHC("EXI");
					pacienteTO.setNombreCompleto(rs.getString(3));
					ret.setObject(pacienteTO);
					ret.setCode(ConstantesSECCD.EXITO_RET);
				}else{
					pacienteTO=new PacienteTO();
					pacienteTO.setTieneHC("NOR");
					ret.setObject(pacienteTO);
					ret.setCode(ConstantesSECCD.EXITO_RET);
				}
			}
		}catch(Exception e){
			ret = new BResult();
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
			System.out.println("[SECCD][PacienteDAO][buscarPacientexHC]:error generado por:"+e.getMessage());
		}finally{
			try{
				pstmt.close();
				rs.close();
			}
			catch(Exception e){
				System.out.println("[SECCD][PacienteDAO][buscarPacientexHC]:error en finally generado por:"+e.getMessage());
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	}

	/**
	 * Metodo para buscar un paciente especifico por numero de DNI
	 * @string dni : DNI paciente
	 * */
	public BResult buscarPacientexDNI(String dni) throws Exception {

		String 					schema			= Configuration.getSchemaDB();
		PacienteTO 				pacienteTO	 	= null;
		PreparedStatement   	pstmt 		 	= null;
		ResultSet 				rs 			 	= null;
		BResult					ret				= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query.append(" SELECT PACIENTE_ID,DNI,NOMBRE_COMPLETO,TIENE_HC"); 
			query.append(" FROM "+schema+"V_PACIENTE WHERE DNI=?"); 
			
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,dni);
			rs=pstmt.executeQuery();
			ret = new BResult();
			if(rs.next()){
				pacienteTO=new PacienteTO();
				pacienteTO.setPaciente_id(rs.getString(1));
				pacienteTO.setDni(rs.getString(2));
				pacienteTO.setNombreCompleto(rs.getString(3));
				pacienteTO.setTieneHC("SI");
				ret.setObject(pacienteTO);
				ret.setCode(ConstantesSECCD.EXITO_RET);;
			}else{
				pacienteTO=new PacienteTO();
				pacienteTO.setTieneHC("NO");
				ret.setObject(pacienteTO);
				ret.setCode(ConstantesSECCD.EXITO_RET);;
			}
		}catch(Exception e){
			System.out.println("[SECCD][PacienteDAO][buscarPacientexDNI]:error generado por:"+e.getMessage());
			ret = new BResult();
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
				rs.close();
			}
			catch(Exception e){
				ret.setCode(ConstantesSECCD.ERROR_RET);
				System.out.println("[SECCD][PacienteDAO][buscarPacientexDNI]:error en finally generado por:"+e.getMessage());
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	}
	
	/**
	 * Metodo que asigna el estado SI al atributo historia clinica de un paciente  
	 * */
	public BResult asignaHCxPaciente(DynaBean dyna) throws Exception {
		String 					schema			= Configuration.getSchemaDB();
		BResult					ret 			= new BResult();
		PreparedStatement		pstmt 		 	= null;
		try{		
			StringBuffer query  = new StringBuffer();
			query.append(" UPDATE "+schema+"PACIENTE SET TIENE_HC='SI'"); 		
			query.append(" WHERE PACIENTE_ID=?");
			pstmt = getConnection().prepareStatement(query.toString());
			pstmt.setString(1,Utilitario.getPropertyDynaBean(dyna,"txtCodigoPaciente"));
			pstmt.executeUpdate();	
			ret.setCode(ConstantesSECCD.EXITO_RET);		
		}catch(Exception e){
			System.out.println("[SECCD][PacienteDAO][asignaHCxPaciente]:error generado por:"+e.getMessage());
			ret.setCode(ConstantesSECCD.ERROR_RET);
			ret.setMessage(e.getMessage());
		}finally{
			try{
				pstmt.close();
			}
			catch(Exception e){
				ret.setCode(ConstantesSECCD.ERROR_RET);
				System.out.println("[SECCD][PacienteDAO][asignaHCxPaciente]:error en finally generado por:"+e.getMessage());
				throw new DAOException(e.getMessage());	
			}
		}
		return ret;
	} 	
}